<template>
  <div>
    <!-- 封面图 -->
    <div
      class="banner"
      :style="articleCover"
    >
      <div class="article-info-container">
        <!-- 文章标题 -->
        <div class="article-title">
          {{ article.title }}
        </div>
        <div class="article-info">
          <div class="first-line">
            <!-- 发表时间 -->
            <span>
              <i class="iconfont iconrili" />
              发表于 {{ article.createTime | date }}
            </span>
            <span class="separator">|</span>
            <!-- 发表时间 -->
            <span>
              <i class="iconfont icongengxinshijian" />
              更新于
              <template v-if="article.createTime">
                {{ article.createTime | date }}
              </template>
              <template v-else>
                {{ article.createTime | date }}
              </template>
            </span>
            <span class="separator">|</span>
            <!-- 文章分类 -->
            <span class="article-category">
              <i class="iconfont iconfenlei1" />
              <router-link :to="'/tags/' + article.articleType">
                <!--                {{ article.category.name }}-->
                <span
                  v-for="(tag, index) in tagList"
                  :key="index"
                >
                  <span v-if="tag.id === article.articleType">{{ tag.typeValue }}</span>
                </span>
              </router-link>
            </span>
          </div>
          <div class="second-line">
            <!-- 字数统计 -->
            <span>
              <i class="iconfont iconzishu" />
              字数统计: {{ wordNum | num }}
            </span>
            <span class="separator">|</span>
            <!-- 阅读时长 -->
            <span>
              <i class="iconfont iconshijian" />
              阅读时长: {{ readTime }}
            </span>
          </div>
          <div class="third-line">
            <span class="separator">|</span>
            <!-- 阅读量 -->
            <span>
              <i class="iconfont iconliulan" /> 阅读量: {{ article.browseNum }}
            </span>
            <span class="separator">|</span>
            <!-- 评论量 -->
            <span>
              <i class="iconfont iconpinglunzu1" />评论数:
              <template v-if="count">{{ count }}</template>
              <template v-else>0</template>
            </span>
          </div>
        </div>
      </div>
    </div>
    <!-- 内容 -->
    <v-row class="article-container">
      <v-col
        md="9"
        cols="12"
      >
        <v-card class="article-wrapper">
          <article
            v-show="!isCheck"
            id="write"
            ref="article"
            class="article-content markdown-body"
            v-html="article.content"
          />

          <!-- 版权声明 -->
          <div class="aritcle-copyright">
            <div>
              <span>创作类型：</span>
              <font v-if="article.isOriginal === 1">
                转载
              </font>
              <font v-else>
                原创
              </font>
            </div>
            <div v-if="article.isOriginal === 0">
              <span>文章作者：</span>
              <router-link
                to="/about"
                target="_blank"
              >
                <font v-if="article.authorName">
                  {{ article.authorName }}
                </font>
                <font v-else>
                  {{ blogInfo.authorInfo.nickName }}
                </font>
              </router-link>
            </div>
            <div>
              <span>文章链接：</span>
              <a
                :href="articleHref"
                target="_blank"
              >{{ articleHref }} </a>
            </div>
            <div v-if="article.isOriginal === 1">
              <span>原文链接：</span>
              <a
                :href="article.originalUrl"
                target="_blank"
              >{{ article.originalUrl }} </a>
            </div>
            <div>
              <span>版权声明：</span>本博客所有文章除特别声明外，均采用
              <a
                href="https://creativecommons.org/licenses/by-nc-sa/4.0/"
                target="_blank"
              >
                CC BY-NC-SA 4.0
              </a>
              许可协议。转载请注明文章出处。
            </div>
          </div>
          <!-- 转发 -->
          <div class="article-operation">
            <share
              style="margin-left:auto"
              :config="config"
            />
          </div>

          <!-- 分割线 -->
          <hr>
          <!-- 评论 -->
          <comment
            ref="commentRef_"
            :comment-list="commentList"
            :count="count"
            :article-id="articleId"
            :ownership="0"
            @reloadComment="listComment"
          />
        </v-card>
      </v-col>
      <!-- 侧边功能 -->
      <v-col
        md="3"
        cols="12"
        class="d-md-block d-none"
      >
        <div style="position: sticky;top: 20px;">
          <!-- 文章目录 -->
          <v-card class="right-container">
            <div class="right-title">
              <i
                class="iconfont iconhanbao"
                style="font-size:16.8px"
              />
              <span style="margin-left:10px">目录</span>
            </div>
            <div id="toc" />
          </v-card>
        </div>
      </v-col>
    </v-row>
  </div>
</template>

<script>
import Clipboard from 'clipboard'
import Comment from '../../components/Comment'
import * as tocbot from 'tocbot'
import {getArticle, msgList} from '@/api'
import {metaInfo} from '@/config/BlogConstant'
import {markdownToHtml} from '@/utils/article'

export default {
  metaInfo: metaInfo,
  components: {
    Comment
  },
  data() {
    return {
      config: {
        sites: ['qzone', 'wechat', 'weibo', 'qq']
      },
      imgList: [],
      articleId: parseInt(this.$route.params.articleId),
      dialogVisible: false,
      code: null,
      isCheck: false,
      article: {
        nextArticle: {
          id: 7,
          articleCover: 'https://picture.xqijun.top/header2.jpg'
        },
        lastArticle: {
          id: 9,
          articleCover: 'https://picture.xqijun.top/header2.jpg'
        },
        category: {
          id: 0,
          name: ''
        },
        recommendArticleList: [],
        newestArticleList: [],
        title: '',
        introduction: '',
        articleType: 1,
        state: 0,
        content: '',
        headerImg: '',
        createTime: '',
        browseNum: 0,
        isTop: 0
      },
      commentList: [],
      count: 0,
      wordNum: '',
      readTime: '',
      articleHref: window.location.href,
      img: process.env.VUE_APP_IMG_API,
      clipboard: null
    }
  },
  computed: {
    blogInfo() {
      return this.$store.state.blogInfo
    },
    articleCover() {
      return (
        'background: url(' +
          this.article.headerImg +
          ') center center / cover no-repeat'
      )
    },
    tagList() {
      return this.$store.state.blogInfo.articleTypes
    },
  },
  created() {
    this.getArticle()
    this.listComment()
  },
  provide() {
    return {
      commentList2: this.commentList
    }
  },
  methods: {
    getArticle() {
      const that = this
      //查询文章
      getArticle(this.articleId).then(res => {
        if (res.data.code !== 2000){
          this.$router.push('/')
          return
        }
        let resData = res.data.data
        // this.article = resData
        Object.assign(this.article, resData)
        document.title = resData.title
        if (resData.introduction != null) {
          document.querySelector('meta[name="keywords"]').setAttribute('content', resData.introduction)
        }
        this.isCheck = false
        //将markdown转换为Html
        this.article.content = markdownToHtml(this.article.content)
        this.$nextTick(() => {
          // 统计文章字数
          this.wordNum = this.deleteHTMLTag(this.article.content).length
          // 计算阅读时间
          this.readTime = Math.round(this.wordNum / 400) + '分钟'
          // 添加代码复制功能
          this.clipboard = new Clipboard('.copy-btn')
          this.clipboard.on('success', () => {
            this.$toast({type: 'success', message: '复制成功'})
          })
          // 添加文章生成目录功能
          let nodes = this.$refs.article.children
          if (nodes.length) {
            for (let i = 0; i < nodes.length; i++) {
              let node = nodes[i]
              let reg = /^H[1-4]{1}$/
              if (reg.exec(node.tagName)) {
                node.id = i
              }
            }
          }
          tocbot.init({
            tocSelector: '#toc', //要把目录添加元素位置，支持选择器
            contentSelector: '.article-content', //获取html的元素
            headingSelector: 'h1, h2, h3,h4', //要显示的id的目录
            hasInnerContainers: true,
            onClick: function (e) {
              e.preventDefault()
            }
          })
          // 添加图片预览功能
          const imgList = this.$refs.article.getElementsByTagName('img')
          for (var i = 0; i < imgList.length; i++) {
            this.imgList.push(imgList[i].src)
            imgList[i].addEventListener('click', function (e) {
              that.previewImg(e.target.currentSrc)
            })
          }

        })
      })
    },
    listComment() {
      msgList(this.articleId, 0).then(res => {
        let resData = res.data
        this.commentList = resData.data
        this.count = resData.data.length
        // this.$refs['commentRef_'].commentList = this.commentList
      })
    },
    previewImg(img) {
      this.$imagePreview({
        images: this.imgList,
        index: this.imgList.indexOf(img)
      })
    },
    deleteHTMLTag(content) {
      return content
        .replace(/<\/?[^>]*>/g, '')
        .replace(/[|]*\n/, '')
        .replace(/&npsp;/gi, '')
    }
  }
}
</script>

<style scoped>
.banner:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

.article-info i {
  font-size: 14px;
}

.article-info {
  font-size: 14px;
  line-height: 1.9;
  display: inline-block;
}

@media (min-width: 760px) {
  .banner {
    color: #eee !important;
  }

  .article-info span {
    font-size: 95%;
  }

  .article-info-container {
    position: absolute;
    bottom: 6.25rem;
    padding: 0 8%;
    width: 100%;
    text-align: center;
  }

  .second-line,
  .third-line {
    display: inline;
  }

  .article-title {
    font-size: 35px;
    margin: 20px 0 8px;
  }

  .pagination-post {
    display: flex;
  }

  .post {
    width: 50%;
  }

  .recommend-item {
    position: relative;
    display: inline-block;
    overflow: hidden;
    margin: 3px;
    width: calc(33.333% - 6px);
    height: 200px;
    background: #000;
    vertical-align: bottom;
  }
}

@media (max-width: 759px) {
  .banner {
    color: #eee !important;
    height: 360px;
  }

  .article-info span {
    font-size: 90%;
  }

  .separator:first-child {
    display: none;
  }

  .blog-container {
    margin: 322px 5px 0 5px;
  }

  .article-info-container {
    position: absolute;
    bottom: 1.3rem;
    padding: 0 5%;
    width: 100%;
    color: #eee;
    text-align: left;
  }

  .article-title {
    font-size: 1.5rem;
    margin-bottom: 0.4rem;
  }

  .post {
    width: 100%;
  }

  .pagination-post {
    display: block;
  }

  .recommend-item {
    position: relative;
    display: inline-block;
    overflow: hidden;
    margin: 3px;
    width: calc(100% - 4px);
    height: 150px;
    margin: 2px;
    background: #000;
    vertical-align: bottom;
  }
}

.article-content {
  word-break: break-word;
  font-size: 14px;
  line-height: 2;
}

.article-operation {
  display: flex;
  align-items: center;
}

.article-category a {
  color: #fff !important;
}

.tag-container a {
  display: inline-block;
  margin: 0.5rem 0.5rem 0.5rem 0;
  padding: 0 0.75rem;
  width: fit-content;
  border: 1px solid #49b1f5;
  border-radius: 1rem;
  color: #49b1f5 !important;
  font-size: 12px;
  line-height: 2;
}

.tag-container a:hover {
  color: #fff !important;
  background: #49b1f5;
  transition: all 0.5s;
}

.aritcle-copyright {
  position: relative;
  margin-top: 40px;
  margin-bottom: 10px;
  font-size: 0.875rem;
  line-height: 2;
  padding: 0.625rem 1rem;
  border: 1px solid #eee;
}

.aritcle-copyright span {
  color: #49b1f5;
  font-weight: bold;
}

.aritcle-copyright a {
  text-decoration: underline !important;
  color: #99a9bf !important;
}

.aritcle-copyright:before {
  position: absolute;
  top: 0.7rem;
  right: 0.7rem;
  width: 1rem;
  height: 1rem;
  border-radius: 1rem;
  background: #49b1f5;
  content: "";
}

.aritcle-copyright:after {
  position: absolute;
  top: 0.95rem;
  right: 0.95rem;
  width: 0.5rem;
  height: 0.5rem;
  border-radius: 0.5em;
  background: #fff;
  content: "";
}

.article-reward {
  margin-top: 5rem;
  display: flex;
  justify-content: center;
  align-items: center;
}

.reward-btn {
  position: relative;
  display: inline-block;
  width: 100px;
  background: #49b1f5;
  margin: 0 1rem;
  color: #fff !important;
  text-align: center;
  line-height: 36px;
  font-size: 0.875rem;
}

.reward-btn:hover .reward-main {
  display: block;
}

.reward-main {
  display: none;
  position: absolute;
  bottom: 40px;
  left: 0;
  margin: 0;
  padding: 0 0 15px;
  width: 100%;
}

.reward-all {
  display: inline-block;
  margin: 0 0 0 -110px;
  padding: 20px 10px 8px !important;
  width: 320px;
  border-radius: 4px;
  background: #f5f5f5;
}

.reward-all:before {
  position: absolute;
  bottom: -10px;
  left: 0;
  width: 100%;
  height: 20px;
  content: "";
}

.reward-all:after {
  content: "";
  position: absolute;
  right: 0;
  bottom: 2px;
  left: 0;
  margin: 0 auto;
  width: 0;
  height: 0;
  border-top: 13px solid #f5f5f5;
  border-right: 13px solid transparent;
  border-left: 13px solid transparent;
}

.reward-item {
  display: inline-block;
  padding: 0 8px;
  list-style-type: none;
}

.reward-img {
  width: 130px;
  height: 130px;
  display: block;
}

.reward-desc {
  margin: -5px 0;
  color: #858585;
  text-align: center;
}

.like-btn {
  display: inline-block;
  width: 100px;
  background: #969696;
  color: #fff !important;
  text-align: center;
  line-height: 36px;
  font-size: 0.875rem;
}

.like-btn-active {
  display: inline-block;
  width: 100px;
  background: #ec7259;
  color: #fff !important;
  text-align: center;
  line-height: 36px;
  font-size: 0.875rem;
}

.pagination-post {
  margin-top: 40px;
  overflow: hidden;
  width: 100%;
  background: #000;
}

.post {
  position: relative;
  height: 150px;
  overflow: hidden;
}

.post-info {
  position: absolute;
  top: 50%;
  padding: 20px 40px;
  width: 100%;
  transform: translate(0, -50%);
  line-height: 2;
  font-size: 14px;
}

.post-cover {
  position: absolute;
  width: 100%;
  height: 100%;
  opacity: 0.4;
  transition: all 0.6s;
  object-fit: cover;
}

.post a {
  position: relative;
  display: block;
  overflow: hidden;
  height: 150px;
}

.post:hover .post-cover {
  opacity: 0.8;
  transform: scale(1.1);
}



hr {
  position: relative;
  margin: 40px auto;
  border: 2px dashed #d2ebfd;
  width: calc(100% - 4px);
}


.right-container {
  padding: 20px 24px;
  font-size: 14px;
}

.right-title {
  display: flex;
  align-items: center;
  line-height: 2;
  font-size: 16.8px;
  margin-bottom: 6px;
}

.right-title i {
  font-weight: bold;
}

.recommend-container {
  margin-top: 40px;
}

.recommend-title {
  font-size: 20px;
  line-height: 2;
  font-weight: bold;
  margin-bottom: 5px;
}

.recommend-cover {
  width: 100%;
  height: 100%;
  opacity: 0.4;
  transition: all 0.6s;
  object-fit: cover;
}

.recommend-info {
  line-height: 2;
  color: #fff;
  position: absolute;
  top: 50%;
  padding: 0 20px;
  width: 100%;
  transform: translate(0, -50%);
  text-align: center;
  font-size: 14px;
}



.recommend-item:hover .recommend-cover {
  opacity: 0.8;
  transform: scale(1.1);
}

.article-item {
  display: flex;
  align-items: center;
  padding: 6px 0;
}

.article-item:first-child {
  padding-top: 0;
}

.article-item:last-child {
  padding-bottom: 0;
}

.article-item:not(:last-child) {
  border-bottom: 1px dashed #f5f5f5;
}

.article-item img {
  width: 100%;
  height: 100%;
  transition: all 0.6s;
  object-fit: cover;
}

.article-item img:hover {
  transform: scale(1.1);
}

.content {
  flex: 1;
  padding-left: 10px;
  word-break: break-all;
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
}

.content-cover {
  width: 58.8px;
  height: 58.8px;
  overflow: hidden;
}

.content-title a {
  transition: all 0.2s;
  font-size: 95%;
}

.content-title a:hover {
  color: #2ba1d1;
}

.content-time {
  color: #858585;
  font-size: 85%;
  line-height: 2;
}
</style>

<style lang="scss">
pre.hljs {
  padding: 12px 2px 12px 40px !important;
  border-radius: 5px !important;
  position: relative;
  font-size: 14px !important;
  line-height: 22px !important;
  overflow: hidden !important;

  &:hover .copy-btn {
    display: flex;
    justify-content: center;
    align-items: center;
  }

  code {
    display: block !important;
    margin: 0 10px !important;
    overflow-x: auto !important;

    &::-webkit-scrollbar {
      z-index: 11;
      width: 6px;
    }

    &::-webkit-scrollbar:horizontal {
      height: 6px;
    }

    &::-webkit-scrollbar-thumb {
      border-radius: 5px;
      width: 6px;
      background: #666;
    }

    &::-webkit-scrollbar-corner,
    &::-webkit-scrollbar-track {
      background: #1e1e1e;
    }

    &::-webkit-scrollbar-track-piece {
      background: #1e1e1e;
      width: 6px;
    }
  }

  .line-numbers-rows {
    position: absolute;
    pointer-events: none;
    top: 12px;
    bottom: 12px;
    left: 0;
    font-size: 100%;
    width: 40px;
    text-align: center;
    letter-spacing: -1px;
    border-right: 1px solid rgba(0, 0, 0, 0.66);
    user-select: none;
    counter-reset: linenumber;

    span {
      pointer-events: none;
      display: block;
      counter-increment: linenumber;

      &:before {
        content: counter(linenumber);
        color: #999;
        display: block;
        text-align: center;
      }
    }
  }

  b.name {
    position: absolute;
    top: 7px;
    right: 45px;
    z-index: 1;
    color: #999;
    pointer-events: none;
  }

  .copy-btn {
    position: absolute;
    top: 6px;
    right: 6px;
    z-index: 1;
    color: #ccc;
    background-color: #525252;
    border-radius: 6px;
    display: none;
    font-size: 14px;
    width: 32px;
    height: 24px;
    outline: none;
  }
}
</style>
